package cn.flying.cloud.base.oss.template;

import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.concurrent.TimeUnit;

import cn.flying.cloud.base.oss.exception.OssException;
import cn.flying.cloud.base.oss.model.BucketInfo;
import cn.flying.cloud.base.oss.model.BucketObjectInfo;

/**
 * oss操作模板
 * bucket 命名规则参见：https://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/bucketnamingrules.html
 *
 * @author: admin
 * @date: 2023年07月12日 21:38
 * @version: 1.0
 */
public interface OssTemplate {

    /**
     * 创建bucket
     *
     * @param bucket bucket名称
     * @return
     * @throws OssException
     */
    boolean createBucket(String bucket) throws OssException;

    /**
     * 获取所有的bucket
     *
     * @return
     * @throws OssException
     */
    List<BucketInfo> getAllBuckets() throws OssException;

    /**
     * 通过bucket名称删除bucket
     *
     * @param bucket bucket名称
     * @return
     * @throws OssException
     */
    boolean deleteBucket(String bucket) throws OssException;

    /**
     * 判断bucket是否存在
     *
     * @param bucket bucket名称
     * @return
     * @throws OssException
     */
    boolean bucketExists(String bucket) throws OssException;

    /**
     * 上传文件
     *
     * @param bucket bucket名称
     * @param file   文件对象
     * @return
     * @throws OssException
     */
    String putObject(String bucket, File file) throws OssException;

    /**
     * 上传文件
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @param stream     文件流对象
     * @return
     * @throws OssException
     */
    String putObject(String bucket, String objectName, InputStream stream) throws OssException;

    /**
     * 上传文件
     *
     * @param bucket      bucket名称
     * @param objectName  对象名称
     * @param stream      文件流对象
     * @param contextType 文件类型
     * @throws OssException
     */
    String putObject(String bucket, String objectName, InputStream stream, String contextType) throws OssException;

    /**
     * 通过objectName从bucket中删除对象
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    boolean deleteObject(String bucket, String objectName) throws OssException;

    /**
     * 获取文件对象
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    BucketObjectInfo getObject(String bucket, String objectName) throws OssException;

    /**
     * 获取文件对象
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    byte[] getObjectBytes(String bucket, String objectName) throws OssException;

    /**
     * 获取文件对象
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @param output     输出流对象
     * @return
     * @throws OssException
     */
    void getObject(String bucket, String objectName, OutputStream output) throws OssException;

    /**
     * 获取对象的url，默认过期时间7天
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @return
     * @throws OssException
     */
    String getObjectUrl(String bucket, String objectName) throws OssException;

    /**
     * 获取对象的url
     *
     * @param bucket     bucket名称
     * @param objectName 对象名称
     * @param expiry     过期时间
     * @param timeUnit   时间单位
     * @return
     * @throws OssException
     */
    String getObjectUrl(String bucket, String objectName, Integer expiry, TimeUnit timeUnit) throws OssException;

    /**
     * 从bucket中获取指定前缀prefix的对象集合
     *
     * @param bucket    bucket名称
     * @param prefix    前缀
     * @param recursive 是否递归查询
     * @return
     * @throws OssException
     */
    List<BucketObjectInfo> getAllObjectsByPrefix(String bucket, String prefix, boolean recursive) throws OssException;
}
